package com.agile.leetcode.easy.areAlmostEqual;

import java.util.Arrays;
import java.util.Objects;

/**
 * 1790. 仅执行一次字符串交换能否使两个字符串相等
 * 给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下：选出某个字符串中的两个下标（不必不同），并交换这两个下标所对应的字符。
 * <p>
 * 如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等，返回 true ；否则，返回 false 。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：s1 = "bank", s2 = "kanb"
 * 输出：true
 * 解释：例如，交换 s2 中的第一个和最后一个字符可以得到 "bank"
 * 示例 2：
 * <p>
 * 输入：s1 = "attack", s2 = "defend"
 * 输出：false
 * 解释：一次字符串交换无法使两个字符串相等
 * 示例 3：
 * <p>
 * 输入：s1 = "kelb", s2 = "kelb"
 * 输出：true
 * 解释：两个字符串已经相等，所以不需要进行字符串交换
 * 示例 4：
 * <p>
 * 输入：s1 = "abcd", s2 = "dcba"
 * 输出：false
 *
 * @Author:ChenZhangKun
 * @Date: 2021/4/7 9:18
 */
public class AreAlmostEqual {
    public static void main(String[] args) {
        AreAlmostEqual areAlmostEqual = new AreAlmostEqual();
        boolean b = areAlmostEqual.solution("bank", "kanb");
        System.out.println(b);
    }

    public boolean areAlmostEqual(String s1, String s2) {
        // 长度是否相等
        if (s1.length() != s2.length()) return false;
        if (Objects.equals(s1, s2)) return true;
        // 遍历
        char[] charArray = s1.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            for (int j = 0; j < charArray.length; j++) {
                // 交换
                char temp;
                temp = charArray[i];
                charArray[i] = charArray[j];
                charArray[j] = temp;
                // 比较
                if (Arrays.equals(charArray, s2.toCharArray())) {
                    return true;
                } else {
                    // 复原
                    temp = charArray[j];
                    charArray[j] = charArray[i];
                    charArray[i] = temp;
                }
            }
        }
        return false;
    }

    /**
     * 比较快的方法
     *
     * @param s1
     * @param s2
     * @return
     */
    public boolean solution(String s1, String s2) {
        // 比较两个是否有多于两个的字符不等
        // 长度是否相等
        if (s1.length() != s2.length()) return false;
        if (Objects.equals(s1, s2)) return true;
        int sub1 = -1, sub2 = -1, count = 0;
        // 遍历
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                if (++count > 2) return false;
                if (count == 1) {
                    sub1 = i;
                } else {
                    sub2 = i;
                }
            }

        }
        return count == 2 && s1.charAt(sub1) == s2.charAt(sub2) && s1.charAt(sub2) == s2.charAt(sub1);
    }
}
